#include "AplicadorRestriccionesDeterministicas.h"

using namespace modelo;

AplicadorRestriccionesDeterministicas::AplicadorRestriccionesDeterministicas(ContextoDeEjecucion* contexto) 
{
	this->contexto = contexto;
};

void AplicadorRestriccionesDeterministicas::AplicarRestriccionesDeterministicas(PlanDeCarrera* planDeCarrera)
{
	InformacionRestriccionesDeterministicas* infoRestricciones = this->contexto->GetInformacionRestriccionesDeterministicas();
	if(!infoRestricciones->GetMateriasOptativasANoCursar().empty())
		this->AplicarRestriccionDeOptativasQueNoQuieroCursar(planDeCarrera);
	if(!infoRestricciones->GetMateriasOptativasACursar().empty())
		this->AplicarRestriccionDeOptativasQueQuieroCursar(planDeCarrera);
	if(!infoRestricciones->GetDisponibilidadHoraria().empty())
		this->AplicarRestriccionDeDisponibilidadHoraria(planDeCarrera);
};

void AplicadorRestriccionesDeterministicas::AplicarRestriccionDeOptativasQueQuieroCursar(PlanDeCarrera* planDeCarrera)
{
	list<InformacionMateria*>::iterator itCodigosOptativas;
	list<InformacionMateria*> materiasParaCursar =  this->contexto->GetInformacionRestriccionesDeterministicas()->GetMateriasOptativasACursar();
	for(itCodigosOptativas = materiasParaCursar.begin(); itCodigosOptativas != materiasParaCursar.end(); itCodigosOptativas++)
	{
		string codigoOptativa = (*itCodigosOptativas)->GetCodigo();
		planDeCarrera->BuscarYEncolarMateriaAlPrincipio(codigoOptativa);
	}
};

void AplicadorRestriccionesDeterministicas::AplicarRestriccionDeOptativasQueNoQuieroCursar(PlanDeCarrera* planDeCarrera)
{
	list<InformacionMateria*>::iterator itCodigosOptativas;
	list<InformacionMateria*> materiasParaNoCursar = this->contexto->GetInformacionRestriccionesDeterministicas()->GetMateriasOptativasANoCursar();
	for(itCodigosOptativas = materiasParaNoCursar.begin(); itCodigosOptativas != materiasParaNoCursar.end(); itCodigosOptativas++)
	{
		string codigoOptativa = (*itCodigosOptativas)->GetCodigo();
		planDeCarrera->BuscarYEncolarMateriaAlFinal(codigoOptativa);
	}
};

void AplicadorRestriccionesDeterministicas::AplicarRestriccionDeDisponibilidadHoraria(PlanDeCarrera* planDeCarrera)
{
	list<InformacionMateria*>::iterator itMaterias;
	list<InformacionMateria*> infoMaterias = this->contexto->GetInformacionMaterias();
	for(itMaterias = infoMaterias.begin(); itMaterias != infoMaterias.end(); itMaterias++)
	{
		list<CatedraMateria*>::iterator itCatedras;
		list<CatedraMateria*> catedras = (*itMaterias)->GetCatedras();
		for(itCatedras = catedras.begin(); itCatedras != catedras.end(); itCatedras++)
		{
			CatedraMateria* catedra = *itCatedras;
			list<DisponibilidadHorariaDiaria*> disponibilidadHoraria = this->contexto->GetInformacionRestriccionesDeterministicas()->GetDisponibilidadHoraria();
			if(!catedra->SeCursaDentroDe(disponibilidadHoraria)) 
			{
				catedra->Deshabilitar();
			}
		}
	}
};
